package com.xk857.forum.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xk857.entities.Forum;
import com.xk857.entities.Replay;
import com.xk857.forum.mapper.ForumMapper;
import com.xk857.forum.mapper.ReplayMapper;
import com.xk857.forum.service.IReplayService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xk857.util.base.Result;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * 星空小屋-回复论坛信息表 服务实现类
 *
 * @author CV大魔王
 * @since 2021-02-23
 */
@Service
public class ReplayServiceImpl extends ServiceImpl<ReplayMapper, Replay> implements IReplayService {

    @Autowired
    private ForumMapper forumMapper;

    @Override
    public List<Replay> findByForumId(String forumId) {
        return baseMapper.findByForumId(forumId);
    }

    @Override
    public Result deleteById(String id) {
        if (StringUtils.isBlank(id)) {
            return Result.error("评论ID不能为空");
        }
        // 要删除的评论ID
        ArrayList<String> ids = new ArrayList<>();
        //先把要删除的一级评论id放入到集合中
        ids.add(id);
        //递归的子评论 id 加入到集合中
        this.getIds(ids, id);
        // 删除回答评论后，还要更新话题表中的回答数量，则先查话题id
        Replay replay = baseMapper.selectById(id);
        //批量删除集合中的id
        int size = baseMapper.deleteBatchIds(ids);
        if (size > 0) {
            // 更新话题表中的回答数量
            Forum forum = forumMapper.selectById(replay.getForumId());
            forum.setReply(forum.getReply() - size);
            forumMapper.updateById(forum);
        }
        return Result.ok();
    }

    /**
     * 递归方法
     *
     * @param ids      要删除的所有评论id
     * @param parentId 父id
     */
    private void getIds(List<String> ids, String parentId) {
        //查询子评论的对象
        QueryWrapper<Replay> wrapper = new QueryWrapper<>();
        wrapper.eq("parent_id", parentId);
        List<Replay> replayList = baseMapper.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(replayList)) {
            for (Replay replay : replayList) {
                String id = replay.getId();
                ids.add(id);
                // 递归继续查询子评论id
                this.getIds(ids, id);
            }
        }
    }


    @Transactional // 进行事务管理
    @Override
    public Result add(Replay replay) {
        // 新增到回答表
        boolean ok = this.save(replay);
        // 更新话题表中的回答数量
        if (ok) {
            // 更新话题表中的回答数量
            Forum forum = forumMapper.selectById(replay.getForumId());
            forum.setReply(forum.getReply() + 1);
            forumMapper.updateById(forum);
        }
        return Result.ok();
    }
}